﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDwgDxfInterface.h"
#include "AcadVersion.h"
#include "ViewportExportSettings.h"
#include "HiddenLineRetreatSettings.h"

namespace gcmp
{
    class IDrawingExportSettings;
    class ISpecificElementExportCustomizer;
    class IElementExportCustomizer;
    class INodeExportCustomizer;
    class ILayerMapping;
    class IHatchMapping;
    class IExportBlockCustomizer;
    class ICADTextStyleCustomize;
    class IDimensionExportDwgCustomizer;  

    /// \brief 导出时管理所有的配置项的接口。
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDrawingExportContext
    {
    public:
        IDrawingExportContext();
        virtual ~IDrawingExportContext();
        
    public:
        /// \brief 创建导出时管理所有的配置项的对象。
        /// 
        /// \return 返回导出时管理所有的配置项的对象。
        static OwnerPtr<IDrawingExportContext> Create();

        /// \brief 设置导出的DWG文件对应的AutoCAD的版本。
        /// \param acadVersion 导出的DWG文件对应的AutoCAD的版本。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetAcadVersion(AcadVersion acadVersion) = 0;

        /// \brief 设置导出的DWG文件对应的AutoCAD的版本。
        /// \param acadVersion 导出的DWG文件对应的AutoCAD的版本。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual AcadVersion GetAcadVersion() const = 0;

        /// \brief 设置导出的层、填充等配置数据。
        /// \param drawingExportSettings 层、填充等配置数据。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetDrawingExportSetting(const OwnerPtr<IDrawingExportSettings>& drawingExportSettings) = 0;

        /// \brief 获取导出的层、填充等配置数据。
        /// 
        /// \return 返回导出的层、填充等配置数据。
        virtual const IDrawingExportSettings* GetDrawingExportSettings() const = 0;
        
        /// \brief 设置导出的视口的配置数据。
        /// \param viewportExportSettings 视口的配置数据。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetViewportExportSettings(std::vector<ViewportExportSettings>& viewportExportSettings) = 0;

        /// \brief 获取导出的视口的配置数据。
        /// 
        /// \return 返回导出的视口的配置数据。
        virtual const std::vector<ViewportExportSettings>& GetViewportExportSettings() const = 0;
        
        /// \brief 设置用户自定义的对特定类别的element的导出接口。
        /// \param opCustomSpecificElementExporter 用户自定义的对特定类别的element的导出接口。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetCustomSpecificElementExporter(const OwnerPtr<ISpecificElementExportCustomizer>& opCustomSpecificElementExporter) = 0;
        
        /// \brief 获取用户自定义的对特定类别的element的导出接口。
        /// 
        /// \return 返回用户自定义的对特定类别的element的导出接口。
        virtual const ISpecificElementExportCustomizer* GetCustomSpecificElementExporter() const = 0;

        /// \brief 设置用户自定义的对element的导出对象。
        /// 
        /// \param opElementExportCustomizer 用户自定义的对element的导出对象的接口。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetElementExportCustomizer(OwnerPtr<IElementExportCustomizer> opElementExportCustomizer) = 0;

        /// \brief 获取用户自定义的对element的导出对象。
        /// 
        /// \return 返回用户自定义的对element的导出对象。
        virtual const IElementExportCustomizer* GetElementExportCustomizer() const = 0;

        /// \brief 设置用户自定义的node节点过滤器
        /// 
        /// \param opNodeExportCustomizer 用户自定义的node节点过滤器
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetNodeExportCustomizer(OwnerPtr<INodeExportCustomizer> opNodeExportCustomizer) = 0;

        /// \brief 获取用户自定义的node节点过滤器
        /// 
        /// \return 返回用户自定义的node节点过滤器
        virtual const INodeExportCustomizer* GetNodeExportCustomizer() const = 0;

        /// \brief 设置用户自定义的对element的导出对象。
        /// 
        /// \param opLayerMapping 用户自定义的对element的导出对象的接口。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetLayerMapping(OwnerPtr<ILayerMapping> opLayerMapping) = 0;

        /// \brief 获取用户自定义的对element的导出对象。
        /// 
        /// \return 返回用户自定义的对element的导出对象。
        virtual const ILayerMapping* GetLayerMapping() const = 0;

        /// \brief 设置用户自定义的对element的导出对象。
        /// 
        /// \param opHatchMapping 用户自定义的对element的导出对象的接口。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetHatchMapping(OwnerPtr<IHatchMapping> opHatchMapping) = 0;

        /// \brief 获取用户自定义的对element的导出对象。
        /// 
        /// \return 返回用户自定义的对element的导出对象。
        virtual const IHatchMapping* GetHatchMapping() const = 0;

        /// \brief 设置用户自定义的填充文件。
        /// 
        /// \param file 用户自定义的填充文件PAT
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetCustomHatchFile(const std::wstring& file) = 0;

        /// \brief 获取用户自定义的填充文件。
        /// 
        /// \return 返回用户自定义的填充文件。
        virtual std::wstring GetCustomHatchFile() const = 0;

        /// \brief 设置用户自定义的对element的导出图块。
        /// 
        /// \param opBlockCustomize 用户自定义的对element的导出图块定制接口。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetExportBlockCustomizer(OwnerPtr<IExportBlockCustomizer> opBlockCustomize) = 0;

        /// \brief 获取用户自定义的对element的导出图块
        /// 
        /// \return 返回用户自定义的对element的导出图块定制接口
        virtual const IExportBlockCustomizer* GetExportBlockCustomizer() const = 0;

        /// \brief 设置用户自定义的CAD文字对象样式。
        /// 
        /// \param opCADTextStyleCustomize 用户自定义的CAD文字样式。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetCADTextStyleCustomize(OwnerPtr<ICADTextStyleCustomize> opCADTextStyleCustomize) = 0;

        /// \brief 获取用户自定义的CAD文字样式。
        /// 
        /// \return 返回用户自定义的CAD文字样式。
        virtual const ICADTextStyleCustomize* GetCADTextStyleCustomize() const = 0;

        /// \brief 设置用户自定义的CAD标注对象样式。
        /// 
        /// \param opDimStyleCustomize 用户自定义的CAD标注样式。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetDimensionStyleCustomize(OwnerPtr<IDimensionExportDwgCustomizer> opDimStyleCustomize) = 0;

        /// \brief 获取用户自定义的CAD标注样式。
        /// 
        /// \return 返回用户自定义的CAD标注样式。
        virtual const IDimensionExportDwgCustomizer* GetDimensionStyleCustomize() const = 0;

        /// \brief 设置是否自定义插入视口位置。
        /// \param isSpecifyInsertViewport 是否设置视口位置。
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetSpecifyInsertViewport(bool isSpecifyInsertViewport) = 0;

        /// \brief 获取是否自定义插入视口位置。
        /// 
        /// \return 返回true表示自定义插入视口的位置；返回false表示按照包围盒自动计算插入视口位置。
        virtual bool GetSpecifyInsertViewport() const = 0;

        /// \brief 克隆一份导出设置对象
        /// 
        /// \return 返回克隆的导出设置对象
        virtual OwnerPtr<IDrawingExportContext> Clone() const = 0;

        /// \brief 指定遮挡退让配置信息
        ///
        /// \param [in] opHiddenLineRetreatSettings 遮挡退让配置信息，具体参考HiddenLineRetreatSettings接口
        /// \return 返回true表示设置成功；返回false表示设置失败。
        virtual bool SetHiddenLineRetreatSettings(OwnerPtr<HiddenLineRetreatSettings> opHiddenLineRetreatSettings) = 0;

        /// \brief 获取遮挡退让配置信息
        /// 
        /// \return 返回用户自定义的遮挡退让配置信息，如果用户没有配置，返回nullptr
        virtual const HiddenLineRetreatSettings* GetHiddenLineRetreatSettings() const = 0;
    };

}


